package advance.reflection;

public class ReflectionDemo01 {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        // Foo 的实例对象如何表示 ？
        // foo1 表示 Foo 的实例对象
        Foo foo1 = new Foo();

        // 任何一个类都是 java.lang.Class 类的实例对象，这个实例对象有三种表示方式
        // 第一种表示方式 --> 实际在告诉我们任何一个了类都有一个隐含的静态成员变量 Class
        Class c1 = Foo.class;
        // 第二种表达方式，已知该类的对象通过 getClass 方法
        Class c2 = foo1.getClass();
        // c1 c2 表示了 Foo 类的类类型(class type)，万事万物皆对象，类也是对象，是 Class 类的实例对象
        // 不管c1 or c2 都代表了 Foo 类的类类型，一个类只可能是 Class 类的一个实例对象
        System.out.println(c1 == c2); // true
        // 第三种表达方式，通过 Class.forName("类全路径")
        Class c3 = null;
        c3 = Class.forName("advance.reflection.Foo");
        System.out.println(c2 == c3); // true
        // 第四种表达方式，通过 ClassLoader.loadClass("")
        //Class clazz = ClassLoader.loadClass("advance.reflection.Foo");

        // 我们完全可以通过类的类类型创建该类的对象实例 --> 通过 c1 or c2 or c3 创建 Foo 的实例
        Foo foo2 = (Foo) c1.newInstance(); // 前提是要有无参构造函数
        foo2.print();
    }
}

/**
 * Foo 类本身也是对象，是 java.lang.Class 类的对象
 */
class Foo {
    void print() {
        System.out.println("hello");
    }
}